package com.atguigu.gmall.product.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.common.cache.GmallCache;
import com.atguigu.gmall.product.model.BaseCategoryView;
import com.atguigu.gmall.product.mapper.BaseCategoryViewMapper;
import com.atguigu.gmall.product.service.BaseCategoryViewService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * VIEW 业务实现类
 *
 * @author atguigu
 * @since 2023-04-21
 */
@Service
public class BaseCategoryViewServiceImpl extends ServiceImpl<BaseCategoryViewMapper, BaseCategoryView> implements BaseCategoryViewService {

    /**
     * 获取首页分类数据
     *  查询所有分类列表：一级分类对象包含二级分类对象，二级分类对象中包含三级分类对象
     * @return
     */
    @Override
    @GmallCache(prefix = "baseCategoryList:")
    public List<JSONObject> getBaseCategoryList() {
        //创建总结果分类集合对象
        List<JSONObject> resultList = new ArrayList<>();
        //查询分类视图获取所有的分类集合
        List<BaseCategoryView> allCategoryList = this.list();
        //根据一级分类的id对所有分类集合进行分组
        Map<Long, List<BaseCategoryView>> category1ListMap = allCategoryList.stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));
        int index = 1;
        //遍历分组后的map，处理一级分类数据
        for (Map.Entry<Long, List<BaseCategoryView>> category1Entry : category1ListMap.entrySet()) {
            //创建一级分类Json对象
            JSONObject category1 = new JSONObject();
            //获取一级分类ID
            Long category1Id = category1Entry.getKey();
            //获取一级分类名称
            String category1Name = category1Entry.getValue().get(0).getCategory1Name();
            //封装一级分类对象
            category1.put("index",index++);
            category1.put("categoryId",category1Id);
            category1.put("categoryName",category1Name);

            //处理当前一级分类中的二级分类
            Map<Long, List<BaseCategoryView>> category2ListMap = category1Entry.getValue().stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));
            //遍历二级分类Map，获取二级分类的id和名称
            List<JSONObject> category2JsonList = new ArrayList<>();
            for (Map.Entry<Long, List<BaseCategoryView>> category2Entry : category2ListMap.entrySet()) {
                //创建二级分类Json对象
                JSONObject category2 = new JSONObject();
                //获取二级分类ID
                Long category2Id = category2Entry.getKey();
                //获取二级分类名称
                String category2Name = category2Entry.getValue().get(0).getCategory2Name();
                //封装二级分类对象
                category2.put("categoryId",category2Id);
                category2.put("categoryName",category2Name);
                category2JsonList.add(category2);

                //处理当前二级分类中的三级分类
                ArrayList<JSONObject> category3JsonList = new ArrayList<>();
                List<BaseCategoryView> category3List = category2Entry.getValue();
                //遍历三级分类集合
                for (BaseCategoryView baseCategoryView : category3List) {
                    //创建三级分类Json对象
                    JSONObject category3 = new JSONObject();
                    //获取三级分类ID
                    Long category3Id = baseCategoryView.getCategory3Id();
                    //获取三级分类名称
                    String category3Name = baseCategoryView.getCategory3Name();
                    //封装三级分类对象
                    category3.put("categoryId",category3Id);
                    category3.put("categoryName",category3Name);
                    category3JsonList.add(category3);
                }
                //将处理后的三级分类放入当前二级分类中
                category2.put("categoryChild",category3JsonList);
            }
            //将处理后的二级分类放入当前一级分类中
            category1.put("categoryChild",category2JsonList);
            //将一级分类对象加入总结果集合
            resultList.add(category1);
        }
        return resultList;
    }
}
